package projet;

import java.io.File;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;

import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.xml.transform.OutputKeys;
import javax.xml.transform.Source;
import javax.xml.transform.Templates;
import javax.xml.transform.TransformerException;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.sax.SAXSource;
import javax.xml.transform.sax.SAXTransformerFactory;
import javax.xml.transform.sax.TransformerHandler;
import javax.xml.transform.stream.StreamResult;
import javax.xml.transform.stream.StreamSource;

import org.xml.sax.InputSource;
import org.xml.sax.XMLReader;
import classes_tables.*;

/**
 * Servlet implementation class ExempleServlet
 * cette classe permet la présentation finale des données liées au role de l'utilisateur 
 * connecté 
 * Récupère aussi toutes les données à partir de la base de données avant de laisser la main 
 * à l' "AnnuaireReader" pour les filtrer selon le role de l'utilisateur connecté
 */
@WebServlet("/ExempleServlet")
public class ExempleServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
	
	private List<Avion> avions;
	private List<Pilote> pilotes;
	private List<Vol> vols;
	

    /**
     * Default constructor. 
     */
    public ExempleServlet() {
        // TODO Auto-generated constructor stub
    	
    }

	/**
	 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
	 * affiche les données finale extrait de la base données après la realisation d'un certain nombre de test 
	 * si le login ou le mot de passe est incorrect un message d'erreur est affiché et redirection automatique vers
	 * la page de l'authentification.
	 * si tout se passe bien la fonction fait appel aux différents module de traitment de données afin de présenter 
	 * une page finale à l'utilisateur 
	 */
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html");
        PrintWriter out = response.getWriter();
        String login = (String) request.getParameter("login");
        String pass  = (String) request.getParameter("password");
        
        User user = new User(login, pass);
        
        out.println("<html>");
        out.println("<head>");
        out.println("<title>Projet XML</title>");
        out.print("<link href=\"page.css\" rel=\"stylesheet\" type=\"text/css\"/>");
        out.println("</head>");
        out.println("<body>");
        out.println("<div id=\"contenu\" class=\"rounded\">");
        
        if(user.getValeurs()[0] ==null)
        {
        	out.print("<h2> le mot de passe ou le login est incorrect veuillez réessayer !</h2>");
        	out.print("<h3><br />Redirection ...");
        	out.print("<br /> Rien ne se passe <a href=\"ServletAuth\"> clique ici</a></h3>");
        	out.print("<meta http-equiv=\"refresh\" content=\"3;URL=ServletAuth\">");
        }
        else
        {
			out.print("<div id=\"profile\" class=\"rounded\">");
			out.print("<br/> Bonjour <b>"+user.getLogin()+"</b>.");
			out.print(" Vous êtes connecté en tant que <b>"+user.getRole()+"</b>");
			out.print("<a id=\"logout\" href=\"LogOut\"><b> D&eacute;connexion </b></a>");
			out.print("</div>");
			
	        out.println("<h2>");
	        
	        Traitement t = new Traitement("root","");
			
			try{
				ResultSet res = t.execRequete("select * from avion");
				avions = creerAvions(res);
				
				ResultSet res1 = t.execRequete("select * from pilote");
				pilotes = creerPilotes(res1);
				
				ResultSet res2 = t.execRequete("select * from vol");
				vols = creerVols(res2);
				
				t.close();
				
				
				// Crï¿½ation de la source DOM
				ServletContext context= this.getServletContext();
				XMLReader annuaireReader = new AnnuaireReader(user.getRole(), context);
	            InputSource annuaireSource = new AnnuaireSource(avions, pilotes, vols); 
	            Source source = new SAXSource(annuaireReader, annuaireSource);
	    
	            // Crï¿½ation du fichier de sortie
	            int index = context.getRealPath("").indexOf(".");
	            String path = context.getRealPath("").substring(0, index-1)+File.separator+"ProjetXml"+File.separator+"WebContent"+File.separator;
	            //File file = new File(path+"AnnuaireSAX.html");
	            
	            
	            //Result resultat = new StreamResult(file);
	    
	            // Configuration du transformer
	            TransformerFactory fabrique = TransformerFactory.newInstance();
	            SAXTransformerFactory saxFactory = (SAXTransformerFactory) fabrique;
	            Templates templates = fabrique.newTemplates(new StreamSource(path+"projet.xsl"));
	            TransformerHandler transformer = saxFactory.newTransformerHandler(templates);
	           
	            
	            //annuaireReader.getContentHandler();
	            
				transformer.getTransformer().setOutputProperty(OutputKeys.ENCODING, "ISO-8859-1");
				transformer.getTransformer().setOutputProperty(OutputKeys.METHOD, "html");
				transformer.getTransformer().setOutputProperty(OutputKeys.INDENT, "yes");
				
				
				transformer.getTransformer().transform(source, new StreamResult(out)); // Transformation
				
					
			}
			catch(SQLException e){ e.printStackTrace();}
			catch(TransformerException e){ e.printStackTrace();}
	        
			out.println("</h2>");

        }
        
		
        out.println("</div>");
        out.println("</body>");
        out.println("</html>");	
			
			
	}

	/**
	 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
	 */
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
	
	
	/**
	 * crée un ensemble d'avion extrait de la base de données 
	 * @param res ResulSet contenant le resultat des données extrait de la base de données 
	 * @return List<Avion> une liste des Avions fabriqués
	 * @throws SQLException
	 */
	public static List<Avion> creerAvions(ResultSet res) throws SQLException
	{
		 List<Avion> result = new ArrayList<Avion>();
		
		while(res.next())
		{
			Avion avion = new Avion( res.getInt("numAvion"), 
									 res.getString("nomAvion"), 
									 res.getInt("capacite"), 
									 res.getString("localisation"));
			result.add(avion);
		}
		
		
		return result; 
				
	}
	
	
	/**
	 * crée un ensemble de pilotes extrait de la base de données 
	 * @param res ResulSet contenant le resultat des données extrait de la base de données 
	 * @return List<Avion> une liste des Pilotes fabriqués
	 * @throws SQLException
	 */
	public static List<Pilote> creerPilotes(ResultSet res) throws SQLException
	{
		 List<Pilote> result = new ArrayList<Pilote>();
		
		while(res.next())
		{
			Pilote pilote = new Pilote( res.getInt("numPilote"),
										res.getString("nomPilote"),
										res.getString("prenomPilote"),
										res.getString("villePilote"), 
										res.getInt("SalairePilote"));
			result.add(pilote);
		}
		
		
		return result; 
				
	}
	
	
	/**
	 * crée un ensemble de vols extrait de la base de données 
	 * @param res ResulSet contenant le resultat des données extrait de la base de données 
	 * @return List<Avion> une liste des Vols fabriqués
	 * @throws SQLException
	 */
	public static List<Vol> creerVols(ResultSet res) throws SQLException
	{
		 List<Vol> result = new ArrayList<Vol>();
		
		while(res.next())
		{
			Vol vol = new Vol( res.getInt("numVol"), 
							   res.getInt("numPilote"),
							   res.getInt("numAvion"),
							   res.getString("villeDepart"),
							   res.getString("villeArrivee"));
			result.add(vol);
		}
		
		
		return result; 
				
	}

}